package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import modele.Theme;

public class ThemeDAO {

	// variables d'instance
	static Connection connection = null;
	static Statement stmt = null;

	static final String SQL_INSERER_THEME = "INSERT INTO `agriotes`.`theme` (`id_theme`, `libelle`) VALUES (NULL, ?);";
	static final String SQL_MODIFIER_THEME = "UPDATE `agriotes`.`theme` SET  `libelle` = ? WHERE  `theme`.`id_theme` = ?";
	static final String SQL_SUPPRIMER_PAR_ID = "DELETE FROM `agriotes`.`theme` WHERE `theme`.`id_theme` = ?";
	static final String SQL_CHERCHER_PAR_ID = "SELECT * FROM `agriotes`.`theme` WHERE `theme`.`id_theme` = ?";
	static final String SQL_LISTER_THEME = "SELECT * FROM `agriotes`.`theme` ORDER BY `id_theme` ASC";
	private static final String	SQL_RECHERCHER_THEME	= "SELECT * FROM `agriotes`.`theme` WHERE libelle LIKE ?";

	private static final String ID_THEME = "id_theme";
	private static final String LIBELLE = "libelle";

	// constructeur pour ThemeDAO
	public ThemeDAO() throws SQLException {

		/**
		 * on essaie de se connecter à la base de données, message d'erreur si
		 * ça ne fonctionne pas : Problème de connection à la base
		 */
			connection = FabriqueDAO.getConnection();
	}

	/**
	 * méthode pour créer une nouveau theme dans la base de données
	 * 
	 * @param t
	 */
	public void inserer(Theme theme) throws SQLException {

		// pour avoir autogenerated id
		// ajouter Statement.RETURN_GENERATED_KEYS
		PreparedStatement pt = connection.prepareStatement(SQL_INSERER_THEME,
				Statement.RETURN_GENERATED_KEYS);

		pt.setString(1, theme.getLibelle());
		pt.executeUpdate();

		// recuperer last inserted id by this connection

		ResultSet rs = pt.getGeneratedKeys();

		if (rs.next()) {
			// set id to this object
			theme.setId_theme(rs.getInt(1));

		}

	}

	/**
	 * méthode pour chercher les informations d'un theme selon son id
	 * 
	 * @param id
	 * @return Theme
	 */

	public Theme lireParId(int id) throws SQLException {

		Theme theme = null;

		PreparedStatement pt = connection.prepareStatement(SQL_CHERCHER_PAR_ID);
		pt.setInt(1, id);
		ResultSet rs = pt.executeQuery();
		if (rs.next()) {

			theme = new Theme();
			theme.setId_theme(rs.getInt(ID_THEME));
			theme.setLibelle(rs.getString(LIBELLE));
		}

		return theme;
	}

	/**
	 * méthode pour mettre à jour un theme de la base de données
	 * 
	 * @param theme
	 */
	public void modifier(Theme theme) throws SQLException {

		PreparedStatement pt = connection.prepareStatement(SQL_MODIFIER_THEME);

		pt.setString(1, theme.getLibelle());
		pt.setInt(2, theme.getId_theme());
		pt.executeUpdate();

	}

	/**
	 * méthode pour effacer un theme de la base de données selon son id
	 * 
	 * @param id
	 */
	public void supprimer(int id) throws SQLException {

		PreparedStatement pt = connection
				.prepareStatement(SQL_SUPPRIMER_PAR_ID);
		pt.setInt(1, id);
		pt.executeUpdate();

	}

	/**
	 * méthode pour lister toutes les themes de la table Theme
	 * 
	 * @return tableauTheme
	 */
	public List<Theme> lister() throws SQLException {

		ArrayList<Theme> tableauTheme = new ArrayList<>();

		PreparedStatement pt = connection.prepareStatement(SQL_LISTER_THEME);

		ResultSet rs = pt.executeQuery();

		while (rs.next()) {

			int id = rs.getInt(ID_THEME);
			String libelle = rs.getString(LIBELLE);

			Theme theme = new Theme(id, libelle);

			tableauTheme.add(theme);
		}

		return tableauTheme;
	}
	
	public List<Theme> recherche(String requete) throws SQLException {
		ArrayList<Theme> tableauTheme = new ArrayList<>();
		
		PreparedStatement pt = connection.prepareStatement(SQL_RECHERCHER_THEME);
		pt.setString(1, "%" + requete + "%");
		ResultSet rs = pt.executeQuery();

		while (rs.next()) {

			int id = rs.getInt(ID_THEME);
			String libelle = rs.getString(LIBELLE);

			Theme theme = new Theme(id, libelle);

			tableauTheme.add(theme);
		}
		
		return tableauTheme;
	}
}
